package controller

import (
	"github.com/kataras/iris/v12"
	"github.com/spf13/cast"
	"strings"
	"wit-admin-go/system/app/dto"
	"wit-admin-go/system/app/service"
	"wit-admin-go/system/utils"
	log "wit-admin-go/system/zaplogger"
)

type RoleController struct{}

var Role = new(RoleController)

// GetRoleById
//
//	@Tags		role
//	@Summary	通过id获取角色信息
//	@accept		x-www-form-urlencoded
//	@Produce	x-www-form-urlencoded
//	@Param		id	query	string	true	"id"
//	@Success	200
//	@Router		/role/getRoleById [get]
//
// @Security ApiKeyAuth
func (us *RoleController) GetRoleById(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	role, err := service.RoleService.GetRoleById(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = "数据没找到"
	} else {
		res.Code = iris.StatusOK
		res.Data = role
		res.Msg = "请求成功"
	}
	_ = ctx.JSON(res)
}

// CreateRole  添加角色
//
//	@Summary		添加角色
//	@Description	添加角色
//	@Tags			role
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			name		query	string		true	"角色名"
//	@Param			sole		query	string		true	"角色唯一标识"
//	@Param			memo		query	string		false	"备注"
//	@Success		200
//	@Router			/role/createRole [post]
//
// @Security ApiKeyAuth
func (us *RoleController) CreateRole(ctx iris.Context) {
	res := new(dto.Result)
	role := new(dto.Role)
	role.Id = utils.GetUid()
	role.CreateId = GetUser(ctx).Id
	err := ctx.ReadForm(role)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.RoleService.PostCreateRole(*role)
	if err != nil {
		res.Code = iris.StatusInternalServerError
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "创建成功"
	}
	_ = ctx.JSON(res)
}

// UpdateRole  修改角色
//
//	@Summary		修改角色
//	@Description	修改角色
//	@Tags			role
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id		query	string		true	"ID"
//	@Param			name	query	string		false	"角色名"
//	@Param			memo	query	string		false	"备注"
//	@Success		200
//	@Router			/role/updateRole [put]
//
// @Security ApiKeyAuth
func (us *RoleController) UpdateRole(ctx iris.Context) {
	res := new(dto.Result)
	role := new(dto.Role)
	role.UpdateId = GetUser(ctx).Id
	err := ctx.ReadForm(role)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.RoleService.PutUpdateRole(*role)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// UpdateRoleMenu  角色绑定菜单
//
//	@Summary		角色绑定菜单
//	@Description	角色绑定菜单
//	@Tags			role
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id		query	string		true	"ID"
//	@Param			menuId	query	[]string	false	"菜单Id"
//	@Success		200
//	@Router			/role/updateRoleMenu [put]
//
// @Security ApiKeyAuth
func (us *RoleController) UpdateRoleMenu(ctx iris.Context) {
	res := new(dto.Result)
	menuId := strings.Split(ctx.FormValue("menuId"), ",")
	roleId := ctx.FormValue("id")
	if roleId == "" || len(menuId) == 0 {
		log.Log.Error("缺少参数Id")
		res.Code = iris.StatusBadRequest
		res.Msg = "缺少参数Id"
		_ = ctx.JSON(res)
		return
	}
	err := service.RoleService.PutUpdateRoleMenu(roleId, menuId)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "绑定成功"
	}
	_ = ctx.JSON(res)
}

// GetList 获取所有角色
//
//	@Summary		获取角色信息
//	@Description	获取角色信息
//	@Tags			role
//	@Param			pageNum		query	int	false	"页码"
//	@Param			pageSize		query	int	false	"每页数"
//	@Param			name		query	string	false	"角色名"
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Success		200
//	@Router			/role/getRoleList [get]
//
// @Security ApiKeyAuth
func (us *RoleController) GetList(ctx iris.Context) {
	res := new(dto.Result)
	page := new(dto.RolePage)
	if err := ctx.ReadForm(page); err != nil {
		res.Code = iris.StatusBadRequest
		res.Msg = "参数错误"
		_ = ctx.JSON(res)
		return
	}
	role, total := service.RoleService.GetRoleList(page)
	res.Data = role
	res.Msg = "请求成功"
	res.Code = iris.StatusOK
	// Header返回总条数
	utils.SetTotal(ctx, total)
	_ = ctx.JSON(res)
}

// DeleteRole 删除角色
//
//	@Summary		删除角色
//	@Description	删除角色同时删除角色下的所有权限
//	@Tags			role
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"role id"
//	@Success		200
//	@Router			/role/deleteRole [delete]
//
// @Security ApiKeyAuth
func (us *RoleController) DeleteRole(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.RoleService.DelRole(id, GetUser(ctx).Id)
	_, _ = utils.WitEnforcer.DeleteRole(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// RemoveRole 永久删除角色
//
//	@Summary		永久删除角色
//	@Description	永久删除角色同时删除角色下的所有权限
//	@Tags			role
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"role id"
//	@Success		200
//	@Router			/role/removeRole [delete]
//
// @Security ApiKeyAuth
func (us *RoleController) RemoveRole(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.RoleService.RemoveRole(id)
	_, _ = utils.WitEnforcer.DeleteRole(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}
